/*
 * Copyright 2005-2013 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 * Project website:
 *      http://www.cottsoft.com
 */
package com.cottsoft.framework.common.util;

import java.util.ArrayList;
import java.util.List;

import com.cottsoft.framework.common.flg.IFlg;

/**
 * Class Description: <br> 
 * 数组，集合的拆分、合并工具类
 * @author  Simon.Hoo(simon@cottsoft.com)
 * @date    2008年6月30日
 * @version v1.0
 * @since   1.0
 */
public class SplitUtils implements IFlg {

	/**
	 * Description: <br>
	 * 将一个大的LIST，按指定长度分拆成多个LIST,并返回分拆后的List，可以用于分页
	 * @param list 分拆前的List
	 * @param subListSize 分拆长度
	 * @return 分拆后的LIST
	 */
	public static <T> List<List<T>> splitList(List<T> list, int subListSize) {
		int listSize = list.size(); // list的大小
		int page = (listSize + (subListSize - 1)) / subListSize; // 拆分的个数

		List<List<T>> listArray = new ArrayList<List<T>>(); // 创建list数组,用来保存分割后的list
		for (int i = 0; i < page; i++) { // 按照数组大小遍历
			List<T> subList = new ArrayList<T>(); // 数组每一位放入一个分割后的list
			for (int j = 0; j < listSize; j++) { // 遍历待分割的list
				int subIndex = ((j + 1) + (subListSize - 1)) / subListSize; // 当前记录的页码(第几页)
				if (subIndex == (i + 1)) { // 当前记录的页码等于要放入的页码时
					subList.add(list.get(j)); // 放入list中的元素到分割后的list(subList)
				}
				if ((j + 1) == ((j + 1) * subListSize)) { // 当放满一页时退出当前循环
					break;
				}
			}
			listArray.add(subList); // 将分割后的list放入对应的数组的位中
		}
		return listArray;
	}
	
	/**
	 * Description：<br>
	 * 将一个字符串数组中间以传入的分割符合并起来，
	 * @param strArray
	 * @param splitFlg
	 * @param isLoHi 是否低位在前，高位在后
	 * @return
	 */
	public static String mergeWithStringArray(String[] strArray, String splitFlg,boolean isLoHi){
		StringBuffer sb = new StringBuffer(strArray.length*2);
		if(isLoHi){
			for(int i=strArray.length-1;i>=0;i--){
				sb.append(strArray[i]);
				if(i<strArray.length){
					sb.append(splitFlg);
				}
			}
		}else{
			for(int i=0;i<strArray.length;i++){
				sb.append(strArray[i]);
				if(i<strArray.length-1){
					sb.append(splitFlg);
				}
			}
		}
		
		return sb.toString().trim();
	}
	
	/**
	 * Description：<br>
	 * 将一个字符串按指定长度时长分割，如果字符串实际长度不能被要分割的长度整除，则在最前面补零。
	 * @param str
	 * @param length
	 * @return
	 */
	public static String[] splitWithLength(String str,int length){
		StringBuffer strSb = new StringBuffer();
		
		int mValue = str.length()%length;
		StringBuffer tmpSb = new StringBuffer();
		if(mValue>0){
			for(int i=0;i<length-mValue;i++){
				tmpSb.append("0");
			}
			
			strSb.append(tmpSb.toString().trim());
		}
		strSb.append(str);
		
		String tmp = strSb.toString().trim();
		String[] tmpArray = new String[tmp.length()/length];
		int j=0;
		for(int i=0;i<tmp.length()/length;i++){
			tmpArray[i] = tmp.substring(j, j+length);
			j = j+length;
		}		
		return tmpArray;
	}
	
	/**
	 * Description：<br>
	 * 将一个字符串按指定长度时长分割，如果字符串实际长度不能被要分割的长度整除，则在前面或后面用传入的指定字符串补齐。
	 * @param str
	 * @param length
	 * @param isPre
	 * @param replace
	 * @return
	 */
	public static String[] splitWithLength(String str,int length,boolean isPre,String replace){
		StringBuffer strSb = new StringBuffer();
		
		int mValue = str.length()%length;
		StringBuffer tmpSb = new StringBuffer();
		if(mValue>0){
			for(int i=0, mv=length-mValue;i<mv;i++){
				tmpSb.append(replace);
			}
			
		}
		
		if(isPre){
			strSb.append(tmpSb.toString().trim());
		}
		strSb.append(str);		
		if(!isPre){
			strSb.append(tmpSb.toString().trim());
		}
		
		String tmp = strSb.toString().trim();
		String[] tmpArray = new String[tmp.length()/length];
		int j=0;
		for(int i=0,tm = tmp.length()/length;i<tm;i++){
			tmpArray[i] = tmp.substring(j, j+length);
			j = j+length;
		}		
		return tmpArray;
	}
	
	/**
	 * Description：<br>
	 * 将一个字符串数组合并成一个字符串，中间以传入的字符分隔离
	 * @param strArray 要合并的字符串数组
	 * @param splitFlg 分隔符
	 * @return 合并后的字符串
	 */
	public static String mergeWithStringArray(String[] strArray, String splitFlg){
		StringBuffer sb = new StringBuffer(strArray.length*2);
		
		for(int i=0;i<strArray.length;i++){
			sb.append(strArray[i]);
			if(i<strArray.length-1){
				sb.append(splitFlg);
			}
		}
		return sb.toString().trim();
	}
	
	
	/**
	 * Description：<br>
	 * 合并字符串从一个二进制数组中
	 * @param binArray 二进制数组
	 * @param splitFlg 分隔符
	 * @param isLoHi 是否高底转换
	 * @return 合并后的字符串
	 */
	public static String mergeWithStringArrayByte(String[] binArray, String splitFlg,boolean isLoHi){
		String returnStr = "";
		int byteLength = binArray.length/8;
		String[] tmp = new String[byteLength];
		int start = 0;
		for(int i=0;i<byteLength;i++){
			StringBuffer sb1 = new StringBuffer(8);
			for(int j=start;j<8;j++,start++){
				sb1.append(binArray[j]);
			}
			tmp[i] = sb1.toString();
		}
		
		if(isLoHi){
			StringBuffer sb1 = new StringBuffer(8);
			for(int j=byteLength-1;j>=0;j--){
				sb1.append(binArray[j]);
			}
			returnStr = sb1.toString();
		}else{
			StringBuffer sb1 = new StringBuffer(8);
			for(int j=0;j<byteLength;j++){
				sb1.append(binArray[j]);
			}
			returnStr = sb1.toString();
		}
		return returnStr;
	}
}


